//
//  UITableView+HACDispatcher.h
//  HACDispatcher
//
//  Created by Chengjie on 2019/5/9.
//

#import <UIKit/UIKit.h>
#import "HACTableViewSectionProtocol.h"

NS_ASSUME_NONNULL_BEGIN

@interface HACTableViewDispatcher : NSObject <UITableViewDataSource, UITableViewDelegate>
/// 滑动事件代理
@property (nonatomic, weak) id<UIScrollViewDelegate> scrollDelegate;
/// 调度器对应的tableView
@property (nonatomic, weak, readonly) UITableView *tableView;

/// 调度器对应的ViewController
@property (nonatomic, weak, readonly) UIViewController *viewController;
- (void)updateViewController:(UIViewController *)viewController;
/// 保存着协议实现者列表
@property (nonatomic, strong, readonly) NSArray<id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *implementorList;
/// 打开权重排序，默认是NO,按照implementorList中元素添加顺序排列
/// 若openWeightRanking = YES，每个组按照rankingWeight来自动排列
@property (nonatomic, assign) BOOL openWeightRanking;

- (NSUInteger)indexOfImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor;
- (id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementorAtIndex:(NSUInteger)index;

/** 用一个新的实现者数组替换HACDispatcher所有的实现者列表 */
- (void)replaceImplementorList:(NSArray<id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *)implementorArr;
- (void)replaceFromRange:(NSRange)range useImplementorArr:(NSArray<id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *)implementorArr;
- (void)replaceImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor useAnImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)anImplementor;
- (void)replaceImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor atIndex:(NSUInteger)index;
- (void)exchangeImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor otherImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)otherImplementor;
- (void)exchangeImplementorAtIndex:(NSUInteger)index otherImplementorIndex:(NSUInteger)otherIndex;
/** 清除所有的实现者，此时tableView将没有任何展示 */
- (void)clearImplementorList;
/** t */
- (void)appendingImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor;
- (void)appendingImplementorArr:(NSArray<id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *)implementorArr;
- (void)deleteImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor;
- (void)deleteImplementorArr:(NSArray<id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *)implementorArr;
- (void)deleteImplementorAtIndex:(NSUInteger)index;
- (void)deleteImplementorAtIndexSet:(NSIndexSet *)indexSet;
- (void)insertImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor atIndex:(NSUInteger)index;
- (void)insertImplementorArr:(NSArray<id <UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *)implementorArr atIndexSet:(NSIndexSet *)indexSet;

/** 局部刷新视图可使用 */
- (void)reoloadDataWithImplementor:(id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>)implementor;
- (void)reoloadDataWithImplementorArr:(NSArray<id<UITableViewDataSource, UITableViewDelegate, HACTableViewSectionProtocol>> *)implementorArr;

@end

@interface UITableView (HACDispatcher)
/**
 是否强制打开调度器，默认是NO，
 开启以后hac_dispatcher将发挥协议分发调度作用
 */
@property (nonatomic, assign) BOOL hac_forceUseDispatcher;

/// 协议分发器
@property (nonatomic, strong, readonly) HACTableViewDispatcher *hac_dispatcher;
/// 设置当前控制器
- (void)hac_setBelongToViewController:(UIViewController *)viewController;

@end

NS_ASSUME_NONNULL_END
